\begin{flushright}
	\zihao{0} 前言
\end{flushright}

构造编译器是一项复杂而有趣的任务。LLVM为编译器提供了可重用组件，其核心库实现了一个世界级的优化代码生成器，它为所有主流CPU架构转换代码提供了独立的中间表示。许多编译器已经在使用LLVM的相关技术了。\par

这本书会教您如何实现自己的编译器，并通过LLVM实现它。您将了解前端编译器如何将源代码转换为抽象语法树，以及如何从中生成中间表示(IR)。如何向编译器添加优化流水，对IR进行优化，并编译为性能不错的机器代码。\par

LLVM框架可以通过多种方式进行扩展，您将学习如何添加新的通道、新的机器指令，甚至是全新的LLVM后端。还有高级主题，如编译不同的CPU架构和扩展Clang、Clang静态分析器与插件和检查器也涵盖其中。本书遵循最实用的方法，并附带了示例源代码，这可以让您更容易得在项目中应用所学习到的知识。\par

\hspace*{\fill} \par %插入空行
\textbf{适宜读者}

本书为刚接触LLVM并且对LLVM框架感兴趣的编译器开发人员、爱好者和工程师编写。对于希望使用基于编译器的工具进行代码分析和改进的C++软件工程师，以及希望获得更多LLVM基本知识的LLVM库的用户也很有用。为了更有效地理解本书中所包含的概念，必须具备C++中级水平。\par

\hspace*{\fill} \par %插入空行
\textbf{本书内容}

\textit{第1章，安装LLVM}，介绍如何设置开发环境。了解如何编译了LLVM库，并学习了如何自定义构建过程。\par

\textit{第2章，浏览LLVM}，介绍各种LLVM项目，并讨论所有项目的统一目录结构。您将使用LLVM核心库创建第一个项目，还可以为不同的CPU架构编译它。\par

\textit{第3章，编译器结构}，提供编译器组件的概述。您将实现可以生成LLVM IR的编译器。\par

\textit{第4章，将源码转换为抽象语法树}，详细地介绍了如何实现编译器前端。您将为小型编程语言创建前端，最后构建抽象语法树。\par

\textit{第5章，生成IR——基础知识}，展示了如何从抽象语法树生成LLVM IR。本章的最后，您将为示例语言实现编译器，从而产生汇编文本或目标代码文件。\par

\textit{第6章，生成高级语言结构的IR}，介绍了如何将高级编程语言中常见的源语言特性转换为LLVM IR。您将了解聚合数据类型的转换、实现类继承和虚函数的各种选项，以及如何遵循系统的ABI。\par

\textit{第7章，生成IR——进阶知识}，介绍了如何在源语言中为异常处理语句生成LLVM IR。了解如何为基于类型的别名分析添加元数据，以及如何向生成的LLVM IR添加调试信息，并且您将扩展编译器生成的元数据。\par

\textit{第8章，优化IR}，介绍LLVM Pass管理器。您将实现你自己的Pass，作为LLVM的一部分或者插件，您将学习如何添加新Pass到优化流水中。\par

\textit{第9章，选择指令}，介绍了LLVM如何减少生成机器指令的IR。您将学习如何在LLVM中定义指令，并将向LLVM添加一条新的机器指令，以便在选择指令时使用新指令。\par

\textit{第10章，JIT编译}，讨论如何使用LLVM来实现JIT编译器。本章结束时，您将通过两种不同的方式实现自己的LLVM IR JIT编译器。\par

\textit{第11章，使用LLVM工具调试}，探索了LLVM的各种库和组件，这可以帮助您了解应用程序中的bug。您将使用“杀虫剂”来识别内存溢出和其他错误。使用libFuzzer库，将随机数据作为输入测试函数。XRay也能帮助您找到性能瓶颈。您将使用Clang静态分析程序来识别源代码级的bug，并且可以将自己的检查程序添加到分析程序中。您还将学习如何使用自己的插件扩展Clang。\par

\textit{第12章，自定义编译器后端}，说明如何向LLVM添加新的后端。需要实现所有必要的类。在本章的最后，将为某种CPU架构编译LLVM IR。\par

\hspace*{\fill} \par %插入空行
\textbf{编译环境}

\textit{需要一台运行Linux、Windows、macOS或FreeBSD的计算机，并为该操作系统安装了开发工具链。所需工具见表。所有工具都应该在shell的搜索路径中。}\par

\begin{table}[H]
	\begin{tabular}{|l|l|}
		\hline
		书中涉及的软件/硬件                                                                                                                  & 操作系统                                                             \\ \hline
		\begin{tabular}[c]{@{}l@{}} C/C++编译器：gcc 5.1.0或更高版本, clang3.5或更高版本\\ Apple clang 6.0或更高版本, Visual Studio 2017或更高版本\end{tabular} & \begin{tabular}[c]{@{}l@{}}Linux(任意衍生版), Windows,\\ macOS,或FreeBSD\end{tabular} \\ \hline
		CMake 3.13.4或更高版本                                                                                                                                  &                                                                                  \\ \hline
		Ninja 1.9.0                                                                                                                                            &                                                                                  \\ \hline
		Python 3.6或更高版本                                                                                                                                    &                                                                                  \\ \hline
		Git 1.7.10或更高版本                                                                                                                                    &                                                                                  \\ \hline
	\end{tabular}
\end{table}

第9章“指令选择”中的DAG可视化，必须安装\url{https://graphviz.org/}的Graphviz。默认情况下，生成的图像是PDF格式的，所以需要PDF查看器来显示。\par

第11章“使用LLVM工具调试”中创建“火焰图”，需要从\url{https://github.com/brendangregg/FlameGraph}获取安装脚本。要运行该脚本，还需要安装最新版本的Perl，要查看图形，还需要一个能够显示SVG文件的Web浏览器(主流浏览器都没问题)。要在同一章中看到Chrome跟踪查看器可视化，需要安装Chrome浏览器。\par

\textbf{如果正在使用本书的数字版本，我们建议您自己输入代码或通过GitHub存储库访问代码(下一节提供链接)，将避免复制和粘贴代码。}\par

\hspace*{\fill} \par %插入空行
\textbf{下载示例}

可以从GitHub网站\url{https://github.com/PacktPublishing/Learn-LLVM-12}下载本书的示例代码。如果有对代码的更新，也会在现有的GitHub存储库中更新。\par

我们还在\url{https://github.com/PacktPublishing/}上提供了丰富的图书和视频目录中的其他代码包。可以一起拿来看看!\par

\hspace*{\fill} \par %插入空行
\textbf{实例演示}

本书代码的演示视频可以在\url{https://bit.ly/3nllhED}上查看 \par

\hspace*{\fill} \par %插入空行
\textbf{下载彩图}

我们还提供了一个PDF文件，里面有本书中使用的屏幕截图/图表的彩色图像。可在此下载:\url{https://static.packt-cdn.com/downloads/9781839213502\_ColorImages.pdf}。\par

\hspace*{\fill} \par %插入空行
\textbf{联系方式}

我们欢迎读者的反馈。\par

反馈：如果你对这本书的任何方面有疑问，需要在你的信息的主题中提到书名，并给我们发邮件到\url{customercare@packtpub.com}。\par

勘误：尽管我们谨慎地确保内容的准确性，但错误还是会发生。如果您在本书中发现了错误，请向我们报告，我们将不胜感激。请访问\url{www.packtpub.com/support/errata}，选择相应书籍，点击勘误表提交表单链接，并输入详细信息。\par

盗版:如果您在互联网上发现任何形式的非法拷贝，非常感谢您提供地址或网站名称。请通过\url{copyright@packt.com}与我们联系，并提供材料链接。\par

如果对成为书籍作者感兴趣：如果你对某主题有专长，又想写一本书或为之撰稿，请访问\url{authors.packtpub.com}。\par

\hspace*{\fill} \par %插入空行
\textbf{欢迎评论}

请留下评论。当您阅读并使用了本书，为什么不在购买网站上留下评论呢？其他读者可以看到您的评论，并根据您的意见来做出购买决定。我们在Packt可以了解您对我们产品的看法，作者也可以看到您对他们撰写书籍的反馈。谢谢你！\par

想要了解Packt的更多信息，请访问\url{packt.com}。\par

\newpage

















